﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows.Forms;
using BadgeManager.Controller;
using BadgeManager.Model;

namespace Badge_Manager.View
{
    public partial class frmAggiungiAlunni : Form
    {
        private Utente utente;
        private StatoForm Stato;
        private Attivita Attivita;
        List<Persona> alunni;
        private List<Persona> alunniInseriti = new List<Persona>();
        private List<Persona> alunniCancellati = new List<Persona>(); // utilizzato solo nella modifica
        private ctrlPersona ctrlPersona = new ctrlPersona();
        private ctrlAttivita ctrlAttivita = new ctrlAttivita(null);
        private DataTable tableAlunni = new DataTable();
        private DataTable tableAlunniInseriti = new DataTable();
        private int postiVuoti;

        public frmAggiungiAlunni(Utente utente,
            StatoForm stato, Attivita attivita)
        {
            InitializeComponent();
            this.utente = utente;
            this.Stato = stato;
            alunni = ctrlPersona.SelectAlunniNonImpegnati();
            SettaColonneGridAlunni();
            this.Attivita = attivita;
            SettaComboBox(cmbCorsi);
            if (attivita != null)
                CambiaStato(stato);
        }

        private void SettaComboBox(ComboBox cmbCorsi)
        {
            if (Stato == StatoForm.Modifica)
                return;
            List<Attivita> listaAttivita = ctrlAttivita.AttivitaInCorsoSenzaAlunniEAuleNonPiene();
            listaAttivita.AddRange(ctrlAttivita.GetAttivitaIndeterminate());
            if (listaAttivita.Count > 0)
            {
                cmbCorsi.DataSource = listaAttivita;
                cmbCorsi.DisplayMember = listaAttivita.ToString();
                cmbCorsi.SelectedIndex = 0;
            }
            else
            {
                if (Attivita == null)
                    MessageBox.Show("Non ci sono Attività privi di Alunni o non ci sono Alunni da poter Inserire", "Attenzione!", MessageBoxButtons.OK, MessageBoxIcon.Information);
                this.Close();
                return;
            }
        }

        private void SettaColonneGridAlunni()
        {
            tableAlunni.Columns.Add("Id", typeof(Guid));
            tableAlunni.Columns.Add("Cognome", typeof(string));
            tableAlunni.Columns.Add("Nome", typeof(string));
            tableAlunni.Columns.Add("Corso", typeof(string));

            tableAlunniInseriti.Columns.Add("Id", typeof(Guid));
            tableAlunniInseriti.Columns.Add("Cognome", typeof(string));
            tableAlunniInseriti.Columns.Add("Nome", typeof(string));
        }

        private void AggiornaTabellaAlunni()
        {
            ctrlAttivita ctrlAttività = new ctrlAttivita(null);
            tableAlunni.Rows.Clear();
            foreach (Persona alunno in alunni)
            {
                Attivita attivita = ctrlAttività.GetAttivitaByPersona(alunno);
                tableAlunni.Rows.Add(
                    alunno.Id,
                    alunno.Cognome,
                    alunno.Nome,
                    ctrlAttività.getCorsoByPersona(alunno) == "" ? "Nessuno" : ctrlAttività.getCorsoByPersona(alunno));
            }
            gridAlunni.DataSource = tableAlunni;
            gridAlunni.Columns["Id"].Visible = false;
            lblPostiVuoti.Text = "Aula: " + Attivita.Stanza.Numero + " Posti Vuoti: " + postiVuoti;
        }

        private void AggiornaTabellaAlunniInseriti()
        {
            tableAlunniInseriti.Rows.Clear();
            foreach (Persona alunno in alunniInseriti)
            {
                tableAlunniInseriti.Rows.Add(alunno.Id,
                    alunno.Cognome, alunno.Nome);
            }
            tableAlunniInseriti.DefaultView.Sort = "Cognome";
            gridAlunniInseriti.DataSource = tableAlunniInseriti;
            gridAlunniInseriti.Columns["id"].Visible = false;
        }

        private void DettagliAttivita()
        {
            if (Attivita == null)
            {
                MessageBox.Show("Non è pervenuta alcuna attivita. Impossibile continuare");
                return;
            }

            lblCorso.Text = Attivita.ToString();
            lblCodCorso.Text = "";
            if (Attivita.Corso != null)
                lblCodCorso.Text = Attivita.Corso.Codice;
            lblDescCorso.Text = Attivita.Descrizione;
        }

        private void CambiaStato(StatoForm stato)
        {
            switch (stato)
            {
                case StatoForm.Nuovo:
                    this.Text = " [Nuovo]";
                    if (Attivita != null)
                        postiVuoti = Attivita.Stanza.Capienza - alunniInseriti.Count;
                    AggiornaTabellaAlunni();
                    break;
                case StatoForm.Modifica:
                    this.Text = " [Modifica]";
                    alunniInseriti = ctrlPersona.SelectAlunniCorsoAttivitàAttuale(this.Attivita.Id);
                    postiVuoti = (Attivita.Stanza.Capienza - alunniInseriti.Count);
                    AggiornaTabellaAlunni();
                    AggiornaTabellaAlunniInseriti();
                    DettagliAttivita();

                    break;
            }
            AbilitaControlli(stato);
        }

        private void AbilitaControlli(StatoForm stato)
        {
            switch (stato)
            {
                case StatoForm.Nuovo:
                    pnlSelAttivita.Visible = true;
                    pnlDettagliAtt.Visible = false;
                    break;
                case StatoForm.Modifica:
                    pnlSelAttivita.Visible = false;
                    pnlDettagliAtt.Visible = true;
                    break;
            }
        }

        private void cmdAggiungi_Click(object sender, System.EventArgs e)
        {
            if (gridAlunni.Rows.Count == 0)
            {
                MessageBox.Show("Impossibile aggiungere non ci sono Alunni!", "Attenzione!"
                    , MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (gridAlunniInseriti.Rows.Count >= Attivita.Stanza.Capienza)
            {
                MessageBox.Show("Impossibile aggiungere altri Alunni, capienza Aula raggiunta!", "Attenzione!"
                    , MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            if (gridAlunni.SelectedRows.Count > 0)
            {
                for (int i = 0; i < gridAlunni.SelectedRows.Count; i++)
                {
                    if (gridAlunni.Columns["id"] != null)
                    {
                        Persona docente = ctrlPersona.SelectObjectPersonaById(
                            (Guid)gridAlunni.SelectedRows[i].Cells["id"].Value);
                        alunniInseriti.Add(docente);
                        foreach (Persona a in alunni) // ricerca e cancellazione
                        {
                            if (a.Id == docente.Id)
                            {
                                alunni.Remove(a);
                                break;
                            }
                        }
                        tableAlunniInseriti.Rows.Add(docente.Id, docente.Nome, docente.Cognome);
                    }
                    postiVuoti--;
                }
                AggiornaTabellaAlunniInseriti();
                AggiornaTabellaAlunni();
            }
        }

        private void cmdRimuovi_Click(object sender, EventArgs e)
        {
            if (gridAlunniInseriti.SelectedRows.Count > 0)
            {
                for (int i = 0; i < gridAlunniInseriti.SelectedRows.Count; i++)
                {
                    if (gridAlunniInseriti.Columns["id"] != null)
                    {
                        Persona alunno = ctrlPersona.SelectObjectPersonaById(
                            (Guid)gridAlunniInseriti.SelectedRows[i].Cells["id"].Value);
                        alunniCancellati.Add(alunno);
                        alunni.Add(alunno);
                        foreach (Persona a in alunniInseriti) // ricerca e cancellazione
                        {
                            if (a.Id == alunno.Id)
                            {
                                alunniInseriti.Remove(a);
                                break;
                            }
                        }
                    }
                    postiVuoti++;
                }

                AggiornaTabellaAlunniInseriti();
                AggiornaTabellaAlunni();
            }
        }

        private void cmdSalvaTutto_Click(object sender, EventArgs e)
        {
            int personeCancellate = 0;
            foreach (Persona a in alunniCancellati)
            {
                personeCancellate += ctrlPersona.setPersonaToAttivitaNULL(this.Attivita, a.Id);
            }
            int personeInserite = 0;
            foreach (Persona a in alunniInseriti)
            {
                if (ctrlPersona.ControllaSeAssociatoACorsoFinito(a.Id))
                    ctrlPersona.setPersonaToAttivitaNULL(a.Id);
                personeInserite += ctrlPersona.setPersonaToAttivita(this.Attivita, a.Id);
            }
            if (personeInserite > 0 || personeCancellate > 0)
                MessageBox.Show("Inserimento Riuscito", "Informazione", MessageBoxButtons.OK, MessageBoxIcon.Information);
            this.Close();
        }

        private void cmbCorsi_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (Stato == StatoForm.Modifica)
                return;
            alunni = ctrlPersona.SelectAlunniNonImpegnati();
            Attivita = (Attivita)cmbCorsi.SelectedItem;
            alunniInseriti = ctrlPersona.SelectAlunniCorsoAttivitàAttuale(Attivita.Id);
            CambiaStato(Stato);
            AggiornaTabellaAlunni();
            AggiornaTabellaAlunniInseriti();
        }

        private void SettaVisibilita(Utente utente)
        {
            ctrlUtente ctrlUtente = new ctrlUtente();
            if (ctrlUtente.isSuperAdmin(utente))
            {
                cmdAggiungi.Enabled = true;
                cmdAnnulla.Enabled = true;
                cmdRimuovi.Enabled = true;
                cmdSalvaTutto.Enabled = true;
            }
            else
            {
                if (ctrlUtente.PuoLeggere(utente))
                {
                    cmdAggiungi.Enabled = false;
                    cmdAnnulla.Enabled = false;
                    cmdRimuovi.Enabled = false;
                    cmdSalvaTutto.Enabled = false;
                }
                if (ctrlUtente.PuoModificare(utente) || ctrlUtente.PuoScrivere(utente))
                {
                    cmdAggiungi.Enabled = true;
                    cmdAnnulla.Enabled = true;
                    cmdRimuovi.Enabled = true;
                    cmdSalvaTutto.Enabled = true;
                }
            }
        }

        private void cmdAnnulla_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}